Qt一步步搭建TcpServer2 | 您所在的位置:网站首页 › qt tcp服务端线程中无法发送数据 › Qt一步步搭建TcpServer2 |
1封装TcpThread
2修改TcpSession
3添加SessionThreads
4修改TcpServer
5总结
承接上章:Qt一步步搭建TcpServer1——封装QTcpServer,QTcpSocket 本章将在TcpServer的基础上新增线程池,管理Session。 1、封装TcpThread正所谓工欲善其事,必先利其器。要实现一个线程池,按照Qt的线程用法(如果不懂用法的同学,可以参看我这篇博客:性能特性测试系列4——QT线程与std::thread(下)之QThread)。要想在这里好好用上去,还是得自己重写一个线程类: 头文件: #ifndef TCPTHREAD_H #define TCPTHREAD_H #include #include class TcpThread : public QThread { public: TcpThread(); ~TcpThread(); virtual void run()override; //会话数 std::atomic_uint32_t SessionCount = 0; }; #endif // TCPTHREAD_Hcpp: #include "TcpThread.h" TcpThread::TcpThread() { } TcpThread::~TcpThread() { } void TcpThread::run() { exec(); }又是个看起来很简单的类,别着急,以后还要加东西的。 关于run里的exec()解释下: 添加进事件循环,这样就能确保线程不执行完,且加进来的Session能够顺利接收自己的事件。 2、修改TcpSession既然QThread都出来了,那么TcpSession也要相应的调整调整了: 头文件: 添加TcpThread的指针: private: TcpThread *Thread_ = nullptr;构造函数修改下: TcpSession(TcpThread *thread);添加个信号函数和槽函数: void SignalDisConnected(void *); void SlotDisConnected();cpp: TcpSession::TcpSession(TcpThread *thread) { this->Thread_ = thread; connect(this, &TcpSession::readyRead, this, &TcpSession::SlotStartRead); connect(this, &TcpSession::disconnected, this, &TcpSession::SlotDisConnected); } TcpSession::~TcpSession() { disconnect(this, &TcpSession::readyRead, this, &TcpSession::SlotStartRead); disconnect(this, &TcpSession::disconnected, this, &TcpSession::SlotDisConnected); } void TcpSession::Disconnect() { qDebug() |
CopyRight 2018-2019 实验室设备网 版权所有 |